home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / ver / 006 / shot.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  2KB  |  99 lines

  1. /* shot.c */
  2.  
  3. #include <xsp2lib.h>
  4.  
  5. #include "main.h"
  6. #include "player.h"
  7. #include "shot.h"
  8.  
  9. #ifndef NULL
  10. #define NULL ((void *) 0)
  11. #endif
  12.  
  13. #define SHOT_MAX    1    /* ショット最大数 */
  14. static SHOT shot[SHOT_MAX];    /* ワーク */
  15.  
  16. #define PALET_SHOT        0x0800
  17.  
  18. #define SHOT_SPEED    31
  19.  
  20.  
  21.  
  22. /* ゲーム開始時に呼ばれる */
  23. void ShotInit (void)
  24. {
  25.     int i;
  26.  
  27.     /* リストをつなげる */
  28.     shot_top = NULL;
  29.     shot_null_top = shot;
  30.     for (i = 0; i < SHOT_MAX; i++)
  31.         shot[i].next = &shot[i + 1];
  32.  
  33.     shot[SHOT_MAX - 1].next = NULL;
  34. }
  35.  
  36.  
  37.  
  38. /* ショット出現時に呼ばれる */
  39. void ShotAlloc (void)
  40. {
  41.     SHOT *p;
  42.  
  43.     if (shot_null_top == NULL)    /* ワークの空きはあるか? */
  44.         return;
  45.  
  46.     p = shot_null_top;
  47.     shot_null_top = p->next;
  48.     p->next = shot_top;
  49.     shot_top = p;
  50.  
  51.     p->lx = (player->x) << 16;    /* ショットの座標は自機+(0,-16) */
  52.     p->ly = (player->y + 4) << 16;    /* 自機の少し上に出す */
  53.     p->pt = obj_shot;
  54.     p->info = PALET_SHOT | PRIORITY_SHOT;
  55.     p->damage = 0;
  56.     p->vx = xytable[SHOT_SPEED][192].x;
  57.     p->vy = xytable[SHOT_SPEED][192].y;
  58. }
  59.  
  60.  
  61.  
  62. /* 垂直同期ごとに呼ばれる */
  63. void ShotMove (void)
  64. {
  65.     SHOT *p, *q;
  66.  
  67.     p = shot_top;        /* 現在注目しているワーク */
  68.     q = NULL;        /* 1つ前のワーク(ワーク削除時に必要) */
  69.     while (p != NULL) {
  70.         /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  71.         p->x = (p->lx += p->vx) >> 16;
  72.         p->y = (p->ly += p->vy) >> 16;
  73.  
  74.         /* ショットが敵に当たった又は画面外に出たか? */
  75.         /* (画面右から出た判定と左から出た判定を1回の比較で行っている事に注目) */
  76.         if ((p->damage)
  77.             || ((unsigned short) (p->x) > 256 + 16)
  78.             || ((unsigned short) (p->y) > 256 + 16)) {
  79.  
  80.             if (q == NULL) {    /* リストの一番最初を削除 */
  81.                 shot_top = p->next;
  82.                 p->next = shot_null_top;
  83.                 shot_null_top = p;
  84.                 q = NULL;
  85.                 p = shot_top;
  86.             } else {
  87.                 q->next = p->next;
  88.                 p->next = shot_null_top;
  89.                 shot_null_top = p;
  90.                 p = q->next;
  91.             }
  92.         } else {
  93.             xobj_set_st (p);
  94.             q = p;
  95.             p = p->next;
  96.         }
  97.     }
  98. }
  99.